package cn.youqu.happy.module.youqu.service.userBlack;

import cn.youqu.happy.framework.common.pojo.PageResult;
import cn.youqu.happy.module.youqu.controller.admin.userBlack.vo.UserBlackCreateReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userBlack.vo.UserBlackExportReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userBlack.vo.UserBlackPageReqVO;
import cn.youqu.happy.module.youqu.controller.admin.userBlack.vo.UserBlackUpdateReqVO;
import cn.youqu.happy.module.youqu.controller.app.userBlack.vo.AppUserBlackJoinReqVO;
import cn.youqu.happy.module.youqu.controller.app.userBlack.vo.AppUserBlackUpdateReqVO;
import cn.youqu.happy.module.youqu.dal.dataobject.userBlack.UserBlackDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 用户黑名单 Service 接口
 *
 * @author 王其岩 20112001045
 */
public interface UserBlackService {

    /**
     * 创建用户黑名单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createUserBlack(@Valid UserBlackCreateReqVO createReqVO);

    Integer joinUserBlack(@Valid AppUserBlackJoinReqVO createReqVO, Long uid);

    /**
     * 校验是否在黑名单内
     *
     * @param targetId 校验的目标
     * @param uid      在谁的黑名单
     * @return
     */
    boolean validateInUserBlack(Long targetId, Long uid);

    /**
     * 获取用户黑名单状态 未在黑明单但会null
     *
     * @param targetId
     * @param uid
     * @return
     */
    UserBlackDO getUserBlack(Long targetId, Long uid);

    /**
     * 更新用户黑名单
     *
     * @param updateReqVO 更新信息
     */
    void updateUserBlack(@Valid UserBlackUpdateReqVO updateReqVO);

    /**
     * 删除用户黑名单
     *
     * @param id 编号
     */
    void deleteUserBlack(Integer id);

    /**
     * 获得用户黑名单
     *
     * @param id 编号
     * @return 用户黑名单
     */
    UserBlackDO getUserBlack(Integer id);

    /**
     * 获得用户黑名单列表
     *
     * @param ids 编号
     * @return 用户黑名单列表
     */
    List<UserBlackDO> getUserBlackList(Collection<Integer> ids);

    /**
     * 获得用户黑名单分页
     *
     * @param pageReqVO 分页查询
     * @return 用户黑名单分页
     */
    PageResult<UserBlackDO> getUserBlackPage(UserBlackPageReqVO pageReqVO);

    /**
     * 获得用户黑名单列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 用户黑名单列表
     */
    List<UserBlackDO> getUserBlackList(UserBlackExportReqVO exportReqVO);

    void deleteUserBlack(Integer id, Long loginUserId);

    PageResult<UserBlackDO> getUserBlackPage(UserBlackPageReqVO pageVO, Long loginUserId);

    List<UserBlackDO> getUserBlackList(Collection<Integer> ids, Long loginUserId);

    List<UserBlackDO> getUserBlackList(Long targetId);

    UserBlackDO getUserBlack(Integer id, Long loginUserId);


    void updateUserBlack(AppUserBlackUpdateReqVO updateReqVO, Long loginUserId);
}
